//题目:
// 让我们一起来玩扫雷游戏！
// 给你一个大小为 m x n 二维字符矩阵 board ，表示扫雷游戏的盘面，其中：
// 'M' 代表一个 未挖出的 地雷，
// 'E' 代表一个 未挖出的 空方块，
// 'B' 代表没有相邻（上，下，左，右，和所有4个对角线）地雷的 已挖出的 空白方块，
// 数字（'1' 到 '8'）表示有多少地雷与这块 已挖出的 方块相邻，
// 'X' 则表示一个 已挖出的 地雷。
// 给你一个整数数组 click ，其中 click = [clickr, clickc] 表示在所有 
// 未挖出的 方块（'M' 或者 'E'）中的下一个点击位置（clickr 是行下标，clickc 是列下标）
// 根据以下规则，返回相应位置被点击后对应的盘面：
// 如果一个地雷（'M'）被挖出，游戏就结束了- 把它改为 'X' 。
// 如果一个 没有相邻地雷 的空方块（'E'）被挖出，修改它为（'B'），并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
// 如果一个 至少与一个地雷相邻 的空方块（'E'）被挖出，修改它为数字（'1' 到 '8' ），表示相邻地雷的数量。
// 如果在此次点击中，若无更多方块可被揭露，则返回盘面。
#include<iostream>
#include<vector>

using namespace std;
//代码:
class Solution 
{
    int dx[8]={-1,1,0,0,-1,-1,1,1};
    int dy[8]={0,0,-1,1,-1,1,-1,1};//上下左右、左斜上、右斜上、左斜下、右斜下
public:
    int count_mine(vector<vector<char>>& board, int row,int col)
    {
        int count=0;
        for(int i=0;i<8;i++)
        {
            int x=row+dx[i],y=col+dy[i];
            if(x>=0 && x<board.size() && y>=0 && y<board[0].size() && board[x][y]=='M')
                count++;
        }
        return count;
    }
    void dfs(vector<vector<char>>& board, int row,int col)
    {
        for(int i=0;i<8;i++)
        {
            int x=row+dx[i],y=col+dy[i];
            if(x>=0 && x<board.size() && y>=0 && y<board[0].size() && board[x][y]=='E')
            {
                int count=count_mine(board,x,y);
                if(count!=0)
                    board[x][y]='0'+count;
                else
                {
                    board[x][y]='B';
                    dfs(board,x,y);
                } 
            }
        }
    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) 
    {
        //判断点击的位置是否是地雷
        if(board[click[0]][click[1]]=='M'){
            board[click[0]][click[1]]='X';
            return board;
        }
        //判断点击的位置周围是否存在地雷
        int count=count_mine(board,click[0],click[1]);
        if(count!=0){
            board[click[0]][click[1]]='0'+count;
            return board;
        }
        //来到这里，说明board[click[0][0]][click[0][1]是一个空白格，递归式将它周围的格子翻开
        board[click[0]][click[1]]='B';
        dfs(board,click[0],click[1]);

        return board;
    }
};
// ["E","E","E","E","E"],
// ["E","E","M","E","E"],
// ["E","E","E","E","E"],
// ["E","E","E","E","E"]